/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

//import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.eventos.bc.CalificacionModuloDelegate;
import org.cip.esymons.eventos.bc.CalificacionModuloAdapter;
import org.cip.esymons.eventos.be.CalificacionModulo;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import org.cip.esymons.eventos.bc.CursoDelegate;
import org.cip.esymons.eventos.bc.InstructorModuloDelegate;
import org.cip.esymons.eventos.bc.MatriculaDelegate;
import org.cip.esymons.eventos.bc.ModuloCursoDelegate;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.be.Curso;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.eventos.be.ModuloCurso;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.EnviaEmail;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author Lizardo Rios
 */
public class CalificacionModuloController {

    CalificacionModuloDelegate delegado;
    ModuloCursoDelegate delegadoModuloCurso;
    private InstructorModuloDelegate delegadoInstructor;
    private MatriculaDelegate delegadoMatricula;
    private CursoDelegate delegadoCurso;
    private CalificacionModulo calificacionModulo;
    private PersonaNatural persona;
    private CalificacionModuloAdapter calificacionModuloAdapter;
    List<CalificacionModuloAdapter> listaCalificacionModuloAdapter;
    private List<CalificacionModulo> listaCalificacionModulo;
    List<Matricula> listaMatricula;
    List<Matricula> listaInscritos;
    List<PersonaNatural> listaInstructor;
    List<CalificacionModulo> listaAprobados;
    private Integer codigoEvento;
    private Integer codigoModulo;
    private String nombreInstructor;
    private Integer nroNotas;
    private boolean ocultarNota2;
    private boolean ocultarNota3;
    private String estiloNota2;
    private String estiloNota3;
    private Double notaMinima;
    private String total;

    /***************************  Constructor *******************************/
    public CalificacionModuloController() {
        calificacionModulo = new CalificacionModulo();
        persona = new PersonaNatural();
        //listaCalificacionModuloAdapter = new ArrayList<CalificacionModuloAdapter>();
        delegado = new CalificacionModuloDelegate();
        delegadoModuloCurso = new ModuloCursoDelegate();
        delegadoInstructor = new InstructorModuloDelegate();
        delegadoMatricula = new MatriculaDelegate();
        delegadoCurso = new CursoDelegate();
        codigoEvento = 0;
        codigoModulo = 0;
        nroNotas = 3;
        ocultarNota2 = false;
        ocultarNota3 = false;
        estiloNota2 = "etiquetas";
        estiloNota3 = "etiquetas";
        notaMinima = new Double(0);
        listaInscritos = new ArrayList<Matricula>();
        listar();
    }

    /*************************** Setters and Getters  ***********************/
    public String getTotal() {
        return total;
    }

    public void setTotal(String total) {
        this.total = total;
    }
    
    public CalificacionModuloAdapter getCalificacionModuloAdapter() {
        return calificacionModuloAdapter;
    }

    public void setCalificacionModuloAdapter(CalificacionModuloAdapter calificacionModuloAdapter) {
        this.calificacionModuloAdapter = calificacionModuloAdapter;
    }

    public CalificacionModulo getCalificacionModulo() {
        return calificacionModulo;
    }

    public void setCalificacionModulo(CalificacionModulo calificacionModulo) {
        this.calificacionModulo = calificacionModulo;
    }

    public CalificacionModuloDelegate getDelegado() {
        return delegado;
    }

    public List<CalificacionModuloAdapter> getListaCalificacionModuloAdapter() {
        return listaCalificacionModuloAdapter;
    }

    public void setListaCalificacionModuloAdapter(List<CalificacionModuloAdapter> listaCalificacionModuloAdapter) {
        this.listaCalificacionModuloAdapter = listaCalificacionModuloAdapter;
    }

    public Integer getCodigoEvento() {
        return codigoEvento;
    }

    public void setCodigoEvento(Integer codigoEvento) {
        this.codigoEvento = codigoEvento;
    }

//    public void setCodEvento(Integer codigoEvento) {
//        this.codigoEvento = codigoEvento;
//    }

    public ModuloCursoDelegate getDelegadoModuloCurso() {
        return delegadoModuloCurso;
    }

    public void setDelegadoModuloCurso(ModuloCursoDelegate delegadoModuloCurso) {
        this.delegadoModuloCurso = delegadoModuloCurso;
    }

    public Integer getCodigoModulo() {
        return codigoModulo;
    }

    public void setCodigoModulo(Integer codigoModulo) {
        this.codigoModulo = codigoModulo;
    }

    public String getNombreInstructor() {
        return nombreInstructor;
    }

    public void setNombreInstructor(String nombreInstructor) {
        this.nombreInstructor = nombreInstructor;
    }

    public InstructorModuloDelegate getDelegadoInstructor() {
        return delegadoInstructor;
    }

    public void setDelegadoInstructor(InstructorModuloDelegate delegadoInstructor) {
        this.delegadoInstructor = delegadoInstructor;
    }

    public PersonaNatural getPersona() {
        return persona;
    }

    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public List<PersonaNatural> getListaInstructor() {
        return listaInstructor;
    }

    public void setListaInstructor(List<PersonaNatural> listaInstructor) {
        this.listaInstructor = listaInstructor;
    }

    public List<CalificacionModulo> getListaCalificacionModulo() {
        listar();
        return listaCalificacionModulo;
    }

    public void setListaCalificacionModulo(List<CalificacionModulo> listaCalificacionModulo) {
        this.listaCalificacionModulo = listaCalificacionModulo;
    }

    public List<Matricula> getListaMatricula() {
        return listaMatricula;
    }

    public void setListaMatricula(List<Matricula> listaMatricula) {
        this.listaMatricula = listaMatricula;
    }

    public MatriculaDelegate getDelegadoMatricula() {
        return delegadoMatricula;
    }

    public void setDelegadoMatricula(MatriculaDelegate delegadoMatricula) {
        this.delegadoMatricula = delegadoMatricula;
    }

    public List<Matricula> getListaInscritos() {
        return listaInscritos;
    }

    public void setListaInscritos(List<Matricula> listaInscritos) {
        this.listaInscritos = listaInscritos;
    }

    public Integer getNroNotas() {
        return nroNotas;
    }

    public void setNroNotas(Integer nroNotas) {
        this.nroNotas = nroNotas;
    }

    public boolean getOcultarNota2() {
        return ocultarNota2;
    }

    public void setOcultarNota2(boolean ocultarNota2) {
        this.ocultarNota2 = ocultarNota2;
    }

    public boolean getOcultarNota3() {
        return ocultarNota3;
    }

    public void setOcultarNota3(boolean ocultarNota3) {
        this.ocultarNota3 = ocultarNota3;
    }

    public String getEstiloNota2() {
        return estiloNota2;
    }
    public void setEstiloNota2(String estiloNota2) {
        this.estiloNota2 = estiloNota2;
    }

    public String getEstiloNota3() {
        return estiloNota3;
    }
    public void setEstiloNota3(String estiloNota3) {
        this.estiloNota3 = estiloNota3;
    }

    public CursoDelegate getDelegadoCurso() {
        return delegadoCurso;
    }
    public void setDelegadoCurso(CursoDelegate delegadoCurso) {
        this.delegadoCurso = delegadoCurso;
    }

    public Double getNotaMinima() {
        return notaMinima;
    }
    public void setNotaMinima(Double notaMinima) {
        this.notaMinima = notaMinima;
    }

    public List<CalificacionModulo> getListaAprobados() {
        return listaAprobados;
    }
    public void setListaAprobados(List<CalificacionModulo> listaAprobados) {
        this.listaAprobados = listaAprobados;
    }

    /*************************** Metodos  ***********************/
    public String guardarNotas() {
        Double promedio = new Double(0);
        if (!validarNotas()) {
            for (CalificacionModulo nota : listaCalificacionModulo) {
                switch (nroNotas) {
                    case 1:
                        promedio = nota.getNota1();
                        break;
                    case 2:
                        promedio = (nota.getNota1() + nota.getNota2()) / nroNotas;
                        break;
                    case 3:
                        promedio = (nota.getNota1() + nota.getNota2() + nota.getNota3()) / nroNotas;
                        break;
                }
                nota.setCalPromedio(redondear(promedio, 2));
                nota.setCalNroNotas(nroNotas);
                nota.setCalEstado(true);
                delegado.edit(nota);
            }
            mostrarMensaje("INFO: ", "Se grabaron las notas con éxito...", FacesMessage.SEVERITY_INFO);
        }
        return listar();
    }

    public String enviar() {
        try {
            Preevento pre = new Preevento();
            PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            pre = delegadoPreevento.findID(codigoEvento);
            if (pre == null) {
                mostrarMensaje("Error: ", "No existe eventos a enviar...", FacesMessage.SEVERITY_ERROR);
                return null;
            }
            ModuloCurso mod = new ModuloCurso();
            ModuloCursoDelegate delegadoModulo = new ModuloCursoDelegate();
            mod = delegadoModulo.find(codigoModulo);
            if (mod == null) {
                mostrarMensaje("Error: ", "No existe eventos a enviar...", FacesMessage.SEVERITY_ERROR);
                return null;
            }
            System.out.println("nombre del evento: " + pre.getPreNombre());
            String origen = "jobs_lizardo@hotmail.com";
            String asunto = "Nota del Curso/Diplomado: " + pre.getPreNombre();
            asunto += " Modulo: " + mod.getModAcronimo() + " " + mod.getModNombre();

            delegadoModulo = null;
            delegadoPreevento = null;

            HttpServletRequest request =  ControladorAbstracto.getRequest();
            String rutaImagen = "/img/LogoCorreo.gif";
            String ruta = request.getRealPath(rutaImagen);

            for (CalificacionModulo cm : listaCalificacionModulo) {
                System.out.println("seEnvio: " + cm.getSeleccion());
                String destino = cm.getMatCodigo().getPreinscripcionEvento().getPersonaNatural().getSolcorreopersonal1();
                System.out.println("correo: " + destino);
                String cuerpo = "       Estimado alumno: ";
                cuerpo += cm.getMatCodigo().getPreinscripcionEvento().getPersonaNatural().getNombreCompleto();
                cuerpo += ", por el presente le estamos enviado las notas por Modulo: ";
                String strNotas = null;
                switch (cm.getCalNroNotas()) {
                    case 0:
                        mostrarMensaje("WARN: ", "Actualiza el nro de notas de este Curso/Diplomado", FacesMessage.SEVERITY_WARN);
                        break;
                    case 1:
                        strNotas = "nota1 = " + cm.getNota1();
                        break;
                    case 2:
                        strNotas = "nota1 = " + cm.getNota1();
                        strNotas += ", nota2 =  " + cm.getNota2();
                        break;
                    case 3:
                        strNotas = "nota1 = " + cm.getNota1();
                        strNotas += ", nota2 =  " + cm.getNota2();
                        strNotas += ", nota3 = " + cm.getNota3();
                        break;
                    case 4:
                        String msg = "Solo se puede registrar hasta 3 notas por modulo \n";
                        msg += "Por ser una regla de negocio del proyecto e-synons";
                        mostrarMensaje("WARN: ", msg, FacesMessage.SEVERITY_WARN);
                        break;
                }
                cuerpo += strNotas;
                cuerpo += ", cualquier duda haganos saber.\n\n";
                cuerpo += "Saludos Cordiales.\n\n";
                cuerpo += "----------------------\n";
                cuerpo += "Ing° Erika Chinchayán\n";
                cuerpo += "CIP - CDLL.";
                Boolean estado = (cm.getSeleccion() != null) ? cm.getSeleccion() : false;
                System.out.println("estado: " + estado);
                if (destino.compareTo("-- no tiene correo --")!=0 && estado) {
                    String mensaje = EnviaEmail.envia(origen, destino, asunto, cuerpo, ruta);
                    if (mensaje == null) {
                        System.out.println("Envio Exitoso...");
                    } else {
                        System.out.println(mensaje);
                    }
                    System.out.println("estoy entrando a nro envios....OK");
                    cm.setCalVeces(cm.getCalVeces() + 1);
                    System.out.println("estoy saliendo de nro envios...OK");
                    delegado.edit(cm);
                }
                destino = null;
                cuerpo = null;
            }
            mostrarMensaje("INFO: ", "Se envio con exito todas la notas a los correos de los alumnos", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se pudo enviar todas la notas a los correos de los alumnos", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public Double redondear(Double numero, int decimales) {
        return Math.round(numero * Math.pow(10, decimales)) / Math.pow(10, decimales);
    }

    public String listar() {
        try {
            listaCalificacionModulo = delegado.listarCalificaciones(codigoEvento, codigoModulo);
            total = Utiles.totalRegistro(listaCalificacionModulo, "alumno(s) matriculado(s)");
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al listar las  notas...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "";
    }

    public String listarModulos() {
        try {
            System.out.print("Codigo Evento: " + codigoEvento);
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            Curso cur = new Curso();
            //if (codigoEvento > 0)
            cur = delegadoCurso.find(codigoEvento);
            if (cur != null)    notaMinima = cur.getCurNotaMinima();
            //listaMatricula = delegado.listarMatriculaXEvento(codigoEvento);
            cur = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al listar alumnos aprobados...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return "";
    }

    public String mostrarAprobados() {
        try {
            listaAprobados = new ArrayList<CalificacionModulo>();
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            codigoModulo = (codigoModulo == null) ? 0 : codigoModulo;
            listaAprobados = delegado.listarAprobados(codigoEvento, codigoModulo);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al listar alumnos aprobados...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return null;
    }

    public String mostrarNotas() {
        try {
            persona = new PersonaNatural();
            System.out.println("codigoEvento: " + codigoEvento);
            System.out.println("codigoModulo: " + codigoModulo);
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            codigoModulo = (codigoModulo == null) ? 0 : codigoModulo;
            //buscar participantes, si existen verificar sus notas
            listaInscritos = delegadoMatricula.listarMatriculadosXCurso(codigoEvento);
            if (!listaInscritos.isEmpty()) {
                System.out.println("OK.....LISTA NO NULA");
                listaMatricula = delegado.listarMatriculasACalificar(codigoEvento, codigoModulo);
                insertarCalificacionesFaltantes();
            }
            listaInstructor = delegadoInstructor.mostrarInstructor(codigoModulo);
            listaCalificacionModulo = delegado.listarCalificaciones(codigoEvento, codigoModulo);
            nroNotas = (listaCalificacionModulo.size() > 0) ? listaCalificacionModulo.get(0).getCalNroNotas() : 0;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al mostrar las  notas...", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return cambiarAccesoNota();
    }

    public String cancelar() {
        codigoEvento = 0;
        codigoModulo = 0;
        calificacionModulo = new CalificacionModulo();
        listaCalificacionModuloAdapter = new ArrayList<CalificacionModuloAdapter>();
        listaCalificacionModulo = new ArrayList<CalificacionModulo>();
        listaMatricula = new ArrayList<Matricula>();
        listaInscritos = new ArrayList<Matricula>();
        listaInstructor = new ArrayList<PersonaNatural>();
        listaAprobados = new ArrayList<CalificacionModulo>();
        return null;
    }

    public boolean validarNotas() {
        try {
            Double nota;
            for (int i = 0; i < listaCalificacionModulo.size(); i++) {
                nota = listaCalificacionModulo.get(i).getNota1();
                if (nota < 0 || nota > 20) {
                    mostrarMensaje("Error: ", "Ingrese Nota entre 0 y 20", FacesMessage.SEVERITY_ERROR);
                    return true;
                }
                nota = listaCalificacionModulo.get(i).getNota2();
                if (nota < 0 || nota > 20) {
                    mostrarMensaje("Error: ", "Ingrese Nota entre 0 y 20", FacesMessage.SEVERITY_ERROR);
                    return true;
                }
                nota = listaCalificacionModulo.get(i).getNota3();
                if (nota < 0 || nota > 20) {
                    mostrarMensaje("Error: ", "Ingrese Nota entre 0 y 20", FacesMessage.SEVERITY_ERROR);
                    return true;
                }
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se permite letras!", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
            return true;
        }
        return false;
    }

    public String insertarCalificacionesFaltantes() {
        try {
            ModuloCurso modulo = delegadoModuloCurso.find(codigoModulo);
            if (modulo != null) {
                for (Matricula m : listaMatricula) {
                    CalificacionModulo c = new CalificacionModulo();
                    c.setMatCodigo(m);                  //matriculados
                    c.setModCodigo(modulo);             //modulo constante
                    c.setCalPromedio(new Double(0));    //por defecto 0
                    c.setCalEstado(false);              //por defecto sin nota
                    c.setNota1(new Double(0));          //por defecto 0
                    c.setNota2(new Double(0));          //por defecto 0
                    c.setNota3(new Double(0));          //por defecto 0
                    c.setCalNroNotas(nroNotas);          //por defecto las tres notas
                    delegado.create(c);
                    c = null;
                }
                modulo = null;
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se pudo insertar calificaciones faltantes", FacesMessage.SEVERITY_ERROR);
            mostrarMensaje("FATAL: ", ex.getMessage(), FacesMessage.SEVERITY_FATAL);
        }
        return listar();
    }

    public SelectItem[] getComboModulos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            System.out.println("codigoEvento: " + codigoEvento);
            //List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModuloXCurso(codigoEvento);
            List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModulo(codigoEvento);
            selects = new SelectItem[listaModulos.size()];
            int cont = 0;
            for (ModuloCurso modulos : listaModulos) {
                SelectItem item = new SelectItem(modulos.getModCodigo(), modulos.getModNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen modulos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboInstructores() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            System.out.println("codigoModulo: " + codigoModulo);
            List<PersonaNatural> listaExpositores = delegadoInstructor.mostrarInstructor(codigoModulo);
            selects = new SelectItem[listaExpositores.size()];
            int cont = 0;
            for (PersonaNatural instructor : listaExpositores) {
                SelectItem item = new SelectItem(instructor.getSolCodigo(), instructor.getNombreCompleto());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Instructores");
            selects[0] = item;
            return selects;
        }
    }

    public String cambiarAccesoNota() {
        switch (nroNotas) {
            case 1:
                ocultarNota2 = true;
                estiloNota2 = "desactivar";
                ocultarNota3 = true;
                estiloNota3 = "desactivar";
                break;
            case 2:
                ocultarNota2 = false;
                estiloNota2 = "etiquetas";
                ocultarNota3 = true;
                estiloNota3 = "desactivar";
                break;
            case 3:
                ocultarNota2 = false;
                estiloNota2 = "etiquetas";
                ocultarNota3 = false;
                estiloNota3 = "etiquetas";
        }
        return "";
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }
    
    
}
